import Axios from 'axios';
import type { AxiosRequestConfig } from 'axios';
import type { BasicResType } from '#/basic';
export const axios = Axios.create({
  // baseURL: import.meta.env.VITE_BASEURL,
  timeout: 30000, // 请求超时 30s
});

// 后置拦截器（获取到响应时的拦截）
axios.interceptors.response.use(
  (response) => {
    /**
     * 根据你的项目实际情况来对 response 和 error 做处理
     * 这里对 response 和 error 不做任何处理，直接返回
     */

    // 没有携带token, 或者token过期
    // response.data.code = -1;
    if (response.data && response.data.code !== 200) {
      return Promise.reject(response.data);
    }
    return response;
  },
  (error) => {
    if (error && error.response) {
      error.code = error.response.status;
      switch (error.response.status) {
        case 400:
          error.errMsg = '错误请求';
          break;
        case 401:
          error.errMsg = '未授权，请重新登录';
          break;
        case 403:
          error.errMsg = '拒绝访问';
          break;
        case 404:
          error.errMsg = '请求错误,未找到该资源';
          break;
        case 405:
          error.errMsg = '请求方法未允许';
          break;
        case 408:
          error.errMsg = '请求超时';
          break;
        case 500:
          error.errMsg = '服务器端出错';
          break;
        case 501:
          error.errMsg = '网络未实现';
          break;
        case 502:
          error.errMsg = '网络错误';
          break;
        case 503:
          error.errMsg = '服务不可用';
          break;
        case 504:
          error.errMsg = '网络超时';
          break;
        case 505:
          error.errMsg = 'http版本不支持该请求';
          break;
        default:
          error.errMsg = `连接错误${error.response.status}`;
      }
    } else {
      // 超时处理
      if (JSON.stringify(error).includes('timeout')) {
        error.errMsg = '服务器响应超时，请刷新当前页';
      }
      error.status = error.status || -1;
      error.errMsg = '连接服务器失败';
    }
    return Promise.reject(error);
  }
);

axios.interceptors.request.use((config: any) => {
  return config;
});

export default function request(
  config: AxiosRequestConfig
): Promise<BasicResType> {
  config.method = config.method || 'GET';
  return axios(config)
    .then((res) => {
      const resdata = res.data;
      const results = {
        code: resdata.code || 200,
        msg: resdata.msg || '',
        data: resdata.data || null,
      };
      return results;
    })
    .catch((error) => {
      return {
        code: error.code,
        msg: error.msg || '',
        data: null,
      };
    });
}
